package ejb.cbm.seguridad.facade;

import java.lang.reflect.InvocationTargetException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.commons.beanutils.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import ejb.cbm.admin.local.ParametroSessionLocal;
import ejb.cbm.commons.BaseFacade;
import ejb.cbm.commons.BaseRuntimeException;
import ejb.cbm.commons.JdbcHelper;
import ejb.cbm.commons.StackTrace2String;
import ejb.cbm.seguridad.bean.OpcionBean;
import ejb.cbm.seguridad.bean.PerfilBean;
import ejb.cbm.seguridad.bean.UsuarioBean;
import ejb.cbm.seguridad.entity.OpcionEntity;
import ejb.cbm.seguridad.entity.PerfilEntity;
import ejb.cbm.seguridad.entity.PerfilOpcionEntity;
import ejb.cbm.seguridad.local.OpcionSessionLocal;
import ejb.cbm.seguridad.local.PerfilFacadeLocal;
import ejb.cbm.seguridad.local.PerfilOpcionSessionLocal;
import ejb.cbm.seguridad.local.PerfilSessionLocal;

////@Stateless
@Service("perfilFacadeLocal")
public class PerfilFacade extends BaseFacade implements PerfilFacadeLocal {
	
	//@EJB
	
	public PerfilSessionLocal perfilSessionLocal;	
	//@EJB
	public OpcionSessionLocal opcionSessionLocal;
	//@EJB
	public PerfilOpcionSessionLocal perfilOpcionSessionLocal;
	//@EJB
	public ParametroSessionLocal parametroSessionLocal;
	
	@Autowired
	public void setPerfilSessionLocal(PerfilSessionLocal perfilSessionLocal) {
		this.perfilSessionLocal = perfilSessionLocal;
	}

	@Autowired
	public void setOpcionSessionLocal(OpcionSessionLocal opcionSessionLocal) {
		this.opcionSessionLocal = opcionSessionLocal;
	}

	@Autowired
	public void setPerfilOpcionSessionLocal(
			PerfilOpcionSessionLocal perfilOpcionSessionLocal) {
		this.perfilOpcionSessionLocal = perfilOpcionSessionLocal;
	}
	
	@Autowired
	public void setParametroSessionLocal(ParametroSessionLocal parametroSessionLocal) {
		this.parametroSessionLocal = parametroSessionLocal;
	}


	////@Resource(mappedName="java:/jdbc/CONNEG")
	//this.protected DataSource dsContinuidad;

	public List<OpcionBean> obtenerOpciones(){
		List<OpcionBean> beans = new ArrayList<OpcionBean>();
		List<OpcionEntity> entities = opcionSessionLocal.findAll();
		OpcionBean bean = null;
		
		try{
			for(OpcionEntity entity : entities){
				bean = new OpcionBean();
				BeanUtils.copyProperties(bean, entity);
				beans.add(bean);
			}
		}catch(IllegalAccessException e){
			throw new BaseRuntimeException(StackTrace2String.stackTraceToString(e));
		}catch(InvocationTargetException e){
			throw new BaseRuntimeException(StackTrace2String.stackTraceToString(e));
		}
		return beans;
	}

	public void save(PerfilBean perfilBean, UsuarioBean usuarioLogeado){
		PerfilEntity entity = null;
		//lista de OpcionEntity para grabar ls opciones
		
		if(perfilBean.getCodigoperfil() == null){
			entity = new PerfilEntity(
					perfilBean.getCodigoperfil(),
					perfilBean.getDescripcionperfil(),
					perfilBean.getTipoperfil(),
					perfilBean.getFlagextorno(),
					perfilBean.getFlagactivo(),
					usuarioLogeado.getCodigousuario(),
					new Date(),
					usuarioLogeado.getCodigousuario(),
					new Date(),
					null
			);
			perfilSessionLocal.save(entity);
		}else{
			entity = perfilSessionLocal.findById(perfilBean.getCodigoperfil());
			if(perfilBean.getDescripcionperfil()!=null) entity.setDescripcionperfil(perfilBean.getDescripcionperfil());
			if(perfilBean.getFlagactivo() != null)entity.setFlagactivo(perfilBean.getFlagactivo());
			if(perfilBean.getTipoperfil() != null)entity.setTipoperfil(perfilBean.getTipoperfil());
			if(perfilBean.getFlagextorno() != null)entity.setFlagextorno(perfilBean.getFlagextorno());
			
			entity.setUsuariomodificacion(usuarioLogeado.getCodigousuario());
			entity.setFechamodificacion(new Date());
			perfilSessionLocal.update(entity);
		}
	}

	public List<PerfilBean> buscar(PerfilBean perfilBean){
		List<PerfilBean> beans = new ArrayList<PerfilBean>();
		List<PerfilEntity> entities =  perfilSessionLocal.findByFiltro(perfilBean);
		PerfilBean bean = null;
		
		try{
			for(PerfilEntity entity : entities){
				bean = new PerfilBean();
				BeanUtils.copyProperties(bean, entity);
				//Se obtiene la descripcion del flagactivo
				bean.setDescripcionflagactivo(parametroSessionLocal.findParametro(new Long(5), new Double(bean.getFlagactivo())).getDescripcion());
				//Se obtiene la descripcion del flagExtorno
				bean.setDescripcionflagextorno(parametroSessionLocal.findParametro(new Long(22), new Double(bean.getFlagextorno())).getDescripcion());
				//Se obtiene la descripcion del tipo de perfil
				bean.setDescripciontipoperfil(parametroSessionLocal.findParametro(new Long(19), new Double(bean.getTipoperfil())).getDescripcion());
				
				beans.add(bean);
			}
		}catch(IllegalAccessException e){
			throw new BaseRuntimeException(StackTrace2String.stackTraceToString(e));
		}catch(InvocationTargetException e){
			throw new BaseRuntimeException(StackTrace2String.stackTraceToString(e));
		}
		return beans;
	}
	
	public List<OpcionBean> obtenerOpcionesMenuUsuario(String codigoUsuario) throws SQLException{
		
		Connection con = null;
		PerfilBean perfilBean = null;
		List<OpcionBean> listMenu = new ArrayList<OpcionBean>();
		List<OpcionBean> listMenu2 = null;
		List<OpcionBean> listMenu3 = null;
		
		try{
			con = this.getConnection();
			
			//Se obtiene el perfil del usuario
			perfilBean = perfilSessionLocal.obtenerPerfilUsuario(con, codigoUsuario);
			
			if(perfilBean != null && perfilBean.getCodigoperfil() != null){
				//Se obtiene los menu de primer nivel
				listMenu = perfilOpcionSessionLocal.menuPrincipal(con);

				for(OpcionBean opcion : listMenu){
					//Se obtiene los menus asociados de segundo nivel
					listMenu2 = perfilOpcionSessionLocal.opcionesMenu(con,perfilBean.getCodigoperfil(), opcion.getCodigoopcion(),new Long(0));
					opcion.setOpciones(listMenu2);
					
					for(OpcionBean opcion1 : listMenu2){
						listMenu3 = perfilOpcionSessionLocal.opcionesMenu(con,perfilBean.getCodigoperfil(), new Long(0),opcion1.getCodigoopcion());
						opcion1.setOpciones(listMenu3);
					}
				}
			}
			
		}finally{
			JdbcHelper.close(con,null,null,null,null);
		}

		return listMenu;
	}
	
	public PerfilBean obtienePerfilByCodigoUsuario(String codigoUsuario) throws SQLException{
		
		Connection con = null;
		PerfilBean bean = null;
		
		try{
			con = this.getConnection();
			bean = perfilSessionLocal.obtenerPerfilUsuario(con, codigoUsuario);
			
		}finally{
			JdbcHelper.close(con,null,null,null,null);
		}
		
		return bean;
	}
	
	//gclv 12/09/2011
	public PerfilBean buscar(Long codigoPerfil) throws SQLException{
		PerfilBean perfilBean = new PerfilBean();
		PerfilEntity perfilEntity = perfilSessionLocal.findById(codigoPerfil);
		OpcionEntity opcionEntity = null;
		OpcionEntity opcionEntityPadre = null;
		OpcionBean opcionBean = null;
		List<OpcionBean> opciones = null;
		Connection con = null;
		String rutaMenu = null;
		
		try{
			con = this.getConnection();
			
			perfilBean.setCodigoperfil(perfilEntity.getCodigoperfil());
			perfilBean.setDescripcionperfil(perfilEntity.getDescripcionperfil());
			perfilBean.setTipoperfil(perfilEntity.getTipoperfil());
			perfilBean.setFlagactivo(perfilEntity.getFlagactivo());
			perfilBean.setFlagextorno(perfilEntity.getFlagextorno());
			
			opciones = new ArrayList<OpcionBean>();
			
			for(PerfilOpcionEntity perfilopcion : perfilEntity.getPerfilopcions()){
				opcionEntity = opcionSessionLocal.findById(perfilopcion.getOpcion().getCodigoopcion());
				opcionBean = new OpcionBean();
				BeanUtils.copyProperties(opcionBean, opcionEntity);
				
				rutaMenu = opcionSessionLocal.obtieneRutaMenu(con, opcionBean.getCodigoopcion());
				opcionBean.setRutamenu(rutaMenu);
								
				opciones.add(opcionBean);
			}
			perfilBean.setOpciones(opciones);
			
		}catch(IllegalAccessException e){
			e.printStackTrace();
			throw new BaseRuntimeException(StackTrace2String.stackTraceToString(e));
		}catch(InvocationTargetException e){
			e.printStackTrace();
			throw new BaseRuntimeException(StackTrace2String.stackTraceToString(e));
		}finally{
			JdbcHelper.close(con);
		}
			return perfilBean;
	}
	
	public List<OpcionBean> obtenerOpcionesPerfil(Long codigoPerfil){
		List<OpcionBean> beans = new ArrayList<OpcionBean>();
		List<PerfilOpcionEntity> entities = perfilOpcionSessionLocal.findbyPerfil(codigoPerfil);
		OpcionBean bean = null;
		
		try{
			for(PerfilOpcionEntity entity : entities){
				bean = new OpcionBean();
				OpcionEntity opcion = entity.getOpcion();
				opcion = opcionSessionLocal.findById(opcion.getCodigoopcion());
				BeanUtils.copyProperties(bean, opcion);
				beans.add(bean);
			}
		}catch(IllegalAccessException e){
			throw new BaseRuntimeException(StackTrace2String.stackTraceToString(e));
		}catch(InvocationTargetException e){
			throw new BaseRuntimeException(StackTrace2String.stackTraceToString(e));
		}
		return beans;
	}
	
	//gclv 14/09/2011 revisar 1
	public List<OpcionBean> obtenerOpcionesNoAsignadas(Long codigoPerfil){
		Connection con = null;
		List<OpcionBean> opciones = new ArrayList<OpcionBean>();
		
		try{
			con = this.getConnection();

			opciones = perfilSessionLocal.obtenerOpcionesNoAsignadas(con, codigoPerfil);
			
		}catch(SQLException e){
			throw new BaseRuntimeException(StackTrace2String.stackTraceToString(e));
		}finally{
			JdbcHelper.close(con);
		}
		
		return opciones;
	}
	
	//gclv 16/09/2011
	public OpcionBean buscarOpcion(Long codigoOpcion){
		OpcionEntity opcionEntity = new OpcionEntity();
		OpcionBean opcionBean = new OpcionBean();
		
		try{
			opcionEntity = opcionSessionLocal.findById(codigoOpcion);
			BeanUtils.copyProperties(opcionBean, opcionEntity);
			//opciones = perfilSessionLocal.obtenerOpcionesNoAsignadas(con, Long.parseLong(codigoOpcion));
			
		}catch(IllegalAccessException e){
			throw new BaseRuntimeException(StackTrace2String.stackTraceToString(e));
		}catch(InvocationTargetException e){
			throw new BaseRuntimeException(StackTrace2String.stackTraceToString(e));
		}
		
		return opcionBean;
	}
}
